/**
 * 批量更新管理器
 * 用于优化小程序setData调用，将多次setData合并为一次执行
 */

/**
 * 创建批量更新管理器
 * @param {Object} pageContext 页面或组件实例
 * @param {Object} options 配置项
 * @param {number} options.waitTime 等待时间(ms)，默认为50ms
 * @param {boolean} options.enableLog 是否启用日志，默认为false
 * @return {Object} 批量更新管理器实例
 */
function createBatchUpdater(pageContext, options = {}) {
  const waitTime = options.waitTime || 50;
  const enableLog = options.enableLog || false;
  
  let pendingData = null;
  let pendingCallbacks = [];
  let timer = null;

  // 日志函数
  const log = enableLog 
    ? (...args) => console.log('[BatchUpdater]', ...args) 
    : () => {};

  /**
   * 执行批量更新
   */
  const flush = () => {
    if (!pendingData) return;
    
    const dataToUpdate = pendingData;
    const callbacks = [...pendingCallbacks];
    
    pendingData = null;
    pendingCallbacks = [];
    timer = null;
    
    log('Batch update with:', dataToUpdate);
    
    // 执行setData并在完成后调用所有回调
    pageContext.setData(dataToUpdate, () => {
      callbacks.forEach(callback => {
        if (typeof callback === 'function') {
          callback();
        }
      });
    });
  };

  /**
   * 合并数据更新
   * @param {Object} data 要更新的数据对象
   * @param {Function} callback 更新完成后的回调函数
   */
  const update = (data, callback) => {
    if (!data || Object.keys(data).length === 0) {
      if (typeof callback === 'function') {
        callback();
      }
      return;
    }

    // 如果还没有待更新数据，则初始化
    if (!pendingData) {
      pendingData = {};
    }
    
    // 合并数据
    Object.assign(pendingData, data);
    
    // 添加回调
    if (typeof callback === 'function') {
      pendingCallbacks.push(callback);
    }
    
    // 如果已经有定时器，就不再设置
    if (timer) return;
    
    // 设置定时器，延迟执行更新
    timer = setTimeout(flush, waitTime);
  };

  /**
   * 立即执行所有待更新的数据
   */
  const forceUpdate = () => {
    if (timer) {
      clearTimeout(timer);
      timer = null;
    }
    flush();
  };

  /**
   * 检查是否有待处理的更新
   * @return {boolean} 是否有待处理的更新
   */
  const isPending = () => {
    return pendingData !== null || timer !== null;
  };

  return {
    update,
    forceUpdate,
    flush,
    isPending
  };
}

module.exports = {
  createBatchUpdater
}; 